import BaseObject from "./baseObject.js";

/**
 * @description 商品基础管理器
 * @extends{BaseObject} 基础对象模型
 * @class {BaseManager}
 * @author hhx
 * @date 2024-11-26 10:11
 * @version 0.1.2
 */
export default class BaseManager extends BaseObject {

    /**
     * @description 数据存储
     * @private
     * @type {Array}
     */
    _items = null;

    /**
     * @description 基础管理器构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props = {}) {
        super(props);
    }

    /**
     * @description 实例化 基础管理器
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {BaseManager|*} 商品对象
     */
    static instance(props = {}) {
        let instance = new BaseManager(props);
        instance.init(props);
        return instance;
    }

    //=========================== 内部成员 ===============================

    /**
     * @description 获取 存储列表
     * @property
     * @protected
     * @return {Array} 存储列表
     */
    get items() {
        return this._items;
    }

    /**
     * @description 设置 存储列表
     * @property
     * @protected
     * @param items {Array} 存储列表
     */
    set items(items) {
        this._items = items;
    }

    //=========================== 成员方法 ===============================

    /**
     * @description 获取 存储列表
     * @public
     * @return {Array} 存储列表
     */
    getItems() {
        return this.items;
    }

    /**
     * @description 设置 存储列表
     * @public
     * @param items {Array} 存储列表
     */
    setItems(items) {
        this.items = items;
    }

    /**
     * @description 判断 列表是否存在
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasItems() {
        return this.isNotNull(this.items);
    }

    //=========================== 基础属性 ===============================

    //=========================== 属性方法 ===============================

    //=========================== 接口方法 ===============================

    /**
     * @description 添加商品
     * @public
     * @param product {object} 商品
     */
    addItem(product) {
        this.items.push(product);
    }

    /**
     * @description 修改商品
     * @public
     * @param id {number} 商品id
     */
    removeItem(id) {
        //
    }

    /**
     * @description 删除商品
     * @public
     * @param product {object} 商品
     */
    updateItem(product) {
        //
    }

    /**
     * @description 查找key
     * @public
     * @param key {string} key
     * @param items {Array} 查找对象
     * @return {boolean  } true 是 false 否
     */
    findItemByKey(key, items = this.items) {

        //边界判断
        if (!this.hasItems()) {
            return false;
        }

        for (let i = 0; i < items.length; i++) {

            if (this.isString(items[i])) {
                this.isEquality(key, items[i]);
            }

            if (this.isNumber(items[i])) {
                this.isEquality(key, items[i]);
            }

            if (this.isArray(items[i])) {
                return this.findItemByKey(key, items[i]);
            }

            if (this.isObject(items[i])) {
                return this.isExistKey(key, items[i]);
            }
        }
        return false;
    }

    /**
     * @description 查找key的值
     * @public
     * @param key {string} key
     * @param value {*} 值
     * @return {boolean} true 是 false 否
     */
    findItemByValue(key, value) {

        //边界判断
        if (!this.hasItems()) {
            return false;
        }

        //是否存在key
        if (!this.findItemByKey(key)) {
            return false;
        }

        for (let i = 0; i < this.items.length; i++) {

            if (key.toString() === i.toString() && this.items[i] === value) {
                return true;
            } else {

                if (this.isObject(this.items[i])) {
                    return this.items[i][key] === value;
                }

            }

        }
        return false;
    }

    //========================== 构建方法 ==========================

    /**
     * @description 初始化方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //初始化属性
        this.initProperty();
    }


    //=========================== 创建方法 ===============================

    //=========================== 构建方法 ===============================

    //=========================== 重载方法 ===============================

    //=========================== 内部方法 ===============================

    /**
     * @description 内部属性初始化
     * @protected
     */
    initProperty() {
        this.items = [];
    }

    /**
     * @description 是否存在key
     * @protected
     * @param key {string} key
     * @param obj {Object} 判断对象
     */
    isExistKey(key, obj) {
        for (const k in obj) {
            if (this.isEquality(key, k)) {
                return true;
            }
        }
    }

    //=========================== 控制方法 ===============================


}


    
 



